package com.vids.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

public class BussinessIDGennelUtil {
    /**
     * 布控与订阅统一标识编码规则 机构编码 1-12位 公安机关机构代码 公安机关机构代码，采用 GA/T 543.1-2011中DE00060
     * 子类型编码 13-14位 表示类型 01-布/撤控 02-告警 03-订阅 04-通知 99-其它 时间编码 15-28
     * 表示布控与订阅生成时间，精确到秒级 YYYYMMDDhhmmss，年月日时分秒 序号 29-33 表示流水序号
     */
    /**
     * 当前时间的流水号 需要设置过期时间
     */
    private static ConcurrentHashMap<String, Integer> serialNumberCash = new ConcurrentHashMap<>();

    /**
     * 生成 布控/告警/订阅/通知/设备/用户 实体类ID
     *
     * @param childCode
     *            子类型编码 01-布/撤控 02-告警 03-订阅 04-通知 99-其它 119 在线视频图像信息采集设备 120
     *            在线视频图像信息采集系统 121 视频卡口 502 公安视频图像分析设备/系统 503 公安视频图像信息数据库 504
     *            公安视频图像信息应用平台
     * @return
     */
    public static String createID(String orgCode, String childCode, boolean needTime, int serialNumberLength) {
	String currentTime = generTimeStr();
	String type = currentTime + childCode;
	Integer currentTimeNumber = serialNumberCash.get(type) == null ? 1 : serialNumberCash.get(type) + 1;
	serialNumberCash.put(type, currentTimeNumber);
	return orgCode + childCode + (needTime ? currentTime : "")
		+ completedZero(currentTimeNumber.toString(), serialNumberLength);
    }

    /**
     * 获取当前日期的字符串格式YYYYMMDDhhmmss
     *
     * @return
     */
    public static String generTimeStr() {
	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
	String currentTime = sdf.format(new Date());
	return currentTime;
    }

    /**
     * 总共 total位 不足补 0
     *
     * @param source
     * @param total
     * @return
     */
    public static String completedZero(String source, int total) {
		source = generalZero(total, "0") + source;
		return source.substring(source.length() - total);
    }

    /**
     * 生成 count 个 text 字符串
     *
     * @param count
     * @return
     */
    public static String generalZero(int count, String text) {
	StringBuffer sb = new StringBuffer();
		Random random = new Random();
		for (int i = 0; i < count; i++) {
		int num = random.nextInt(9);
	    sb.append(num);
	}
	System.out.println(sb.toString());
	return sb.toString();
    }

    /**
     * 1-20 ： 设备编码/应用平台编码 21-22 ：类型编码 01-视频片段 02-图像 03-文件 99-其他 23-36 ：时间编码
     * YYYYMMDDhhmmss，年月日时分秒 37-41 ：视频图像信息基本对象序号 42-43 ：子类型编码 01-人员 02-机动车
     * 03-非机动车 04-物品 05-场景 06-人脸 07-视频图像标签 99-其他 44-48 ：视频图像信息语义属性对象序号
     *
     * @return
     */
    public static String createViewLibraryID(String deviceID, String pCode, boolean isChildrenType, String cCode) {
	String currentTime = generTimeStr();
	String type = currentTime + pCode;
	Integer currentTimeNumber = serialNumberCash.get(type) == null ? 1 : serialNumberCash.get(type) + 1;
	serialNumberCash.put(type, currentTimeNumber);
	if (isChildrenType) {
	    return deviceID + pCode + currentTime + completedZero(currentTimeNumber.toString(), 5) + cCode
		    + completedZero(currentTimeNumber.toString(), 5);
	} else {
	    return deviceID + pCode + currentTime + completedZero(currentTimeNumber.toString(), 5);
	}
    }

    public static void main(String[] args) {
	String appId = "42010000005040000000";
	String code = "01";
	String s = createViewLibraryID(appId, code, false, null);
	String s2 = createViewLibraryID(appId, code, false, null);
	System.out.println(s);
	System.out.println(s.length());
	System.out.println(s2);
	System.out.println(s2.length());
    }

}
